// Thread mit gegenseitigem Ausschluss
// gt, 9.5.01
//
// In java wird bekanntlich ein Monitorprinzip verwirklicht.
// Es ist aber nicht moeglich, ganze Klassen zu "synchronize"en,
// stattdessen muss synchronized auf einzelne Methoden oder Bloecke
// angewendet werden.
// Um nun einen Block in einer Klasse zu schuetzen, braucht
// man in Java ein Objekt, bezueglich diesem der Zugriffsschutz
// durchzusetzen ist. Bevor nun irgend ein "FeldWeld&Wiesen"-
// Objekt fuer sowas kreiert wird, kann man sich einfach die
// getClass() Methode zu nutze machen, die fuer jeden Thread,
// der die run-Methode einer Klasse ausfuehrt, dieselbe Objekt-
// referenz retourniert.

public class MiniThread extends Thread
{
    static volatile int cnt = 0;
    static volatile int[] cntArray = new int[15000];
    static int einer = 0;
    

    public static void main(String[] args)
    {
        Thread t1 = new MiniThread();
        t1.setName("t1");
        t1.start();

        Thread t2 = new MiniThread();
        t2.setName("t2");
        t2.start();
        
        try {
			t1.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        try {
			t2.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        
        for(int i = 0; i < 10000; i++) {
        	if(cntArray[i] != 1) {
        		System.out.println("Im Feld " + i + " steht " + cntArray[i]);
        	} else
        		einer++;
        }
        System.out.println("Es gibt " + einer + " 1er");
    }

    public void run()
    {
        while (true)
        {
            //synchronized(getClass())
            {
                if (cnt > 10000) break;
                cntArray[cnt] += 1;
                cnt++;
                //System.out.println(getName() + ":" + cnt++);   //mit Threadnummer
//                System.out.println(cnt++);                     // ohne Threadnummer
            }
        }
    }
}

// PS:  Anstelle von getClass() kann natuerlich jedes andere
//      "einzigartige" Objekt verwendet werden, aber die eigene
//      Klasse bietet sich natuerlich an.
// Mmh: Wieso wird eigentlich nicht "cnt" genommen??? Da static 
//      muesst er ja bezueglich dieser Klasse "einzigartig" sein.
//      Tja, die Java-Basistypen sind leider keine Objekte!!!
//      Soll heissen, da gibt auch keine Referenz drauf!
// volatile Basistypen sollen laut www.javaperformancetuning.com
//      atomar cnt++ ermoeglichen. Ich hab da andere Erfahrungen.
